<?php
// +----------------------------------------------------------------------
// | 微信支付宝支付，使用第三方类库WeChatDeveloper
// | Gitee：https://gitee.com/zoujingli/WeChatDeveloper
// +----------------------------------------------------------------------
declare (strict_types=1);

namespace app\common\tool\pay;

use Alipay\EasySDK\Kernel\Config;
use Alipay\EasySDK\Kernel\Factory;

class Pay
{

    /**
     * @param PayPreset $preset -- 依赖注入，前置参数
     * 原点 2022年1月8日15:54:32 发起微信支付
     * code码 返回4代表H5支付，5 -> JSAPI支付 1 -> APP支付
     */
    public static function WeChatPayV2(PayPreset $preset): array
    {
        try {
            $wechat = new \WeChat\Pay($preset->getConfig()['wechat']);
            $trade_type = $preset->getTradeType();

            $options = [
                'body' => $preset->getSubject(),
                'out_trade_no' => $preset->getOutTradeNo(),
                'total_fee' => $preset->getTotal() * 100,
                'trade_type' => $trade_type,
                'notify_url' => $preset->getNotifyUrl(),
                'spbill_create_ip' => request()->ip(),
            ];
            if ($trade_type == 'JSAPI') {
                $options['openid'] = $preset->getOpenId();
            }

            $result = $wechat->createOrder($options);
            if ($result['return_msg'] != 'OK') {
                return ['code' => -1, 'msg' => $result['return_msg']];
            }
            switch ($trade_type) {
                case "JSAPI":
                    $options = $wechat->createParamsForJsApi($result['prepay_id']);
                    return ['code' => 5, 'result' => $options];
                case "MWEB":
                    $result['mweb_url'] .= '&redirect_url=' . urlencode($preset->getRedirectUrl());
                    return ['code' => 4, 'result' => $result['mweb_url']];
                case "APP":
                    $options = $wechat->createParamsForApp($result['prepay_id']);
                    return ['code' => 1, 'result' => $options];
                default:
                    return ['code' => -1, 'result' => '暂不支持其他支付方式'];
            }

        } catch (\Exception $e) {
            return ['code' => -1, 'msg' => $e->getMessage()];
        }
    }

    /**
     * @param PayPreset $preset -- 依赖注入，前置参数
     * 原点 2022年1月8日15:54:32 发起支付宝手机网站支付
     */
    public static function AliPayWeb(PayPreset $preset)
    {

        $config = $preset->getConfig()['alipay'];
        Factory::setOptions(self::getOptions($config,$preset->getNotifyUrl()));

        try {
            $result = Factory::payment()->wap()->pay(
                $preset->getSubject(),
                $preset->getOutTradeNo(),
                $preset->getTotal(),
                $preset->getRedirectUrl(),
                $preset->getRedirectUrl());

            return ['code' => 3, 'result' => $result->body];

        } catch (\Exception $e) {
            return ['code' => -1, 'msg' => $e->getMessage(), 'result' => ''];

        }

    }


    public static function getOptions($config, $notifyUrl = '')
    {

        $options = new Config();
        $options->protocol = 'https';
        $options->gatewayHost = 'openapi.alipay.com';
        $options->signType = 'RSA2';

        $options->appId = $config['appid'];

        // 为避免私钥随源码泄露，推荐从文件中读取私钥字符串而不是写入源码中
        $options->merchantPrivateKey = $config['private_key'];
        //options->alipayCertPath = '<-- 请填写您的支付宝公钥证书文件路径，例如：/foo/alipayCertPublicKey_RSA2.crt -->';
        //$options->alipayRootCertPath = '<-- 请填写您的支付宝根证书文件路径，例如：/foo/alipayRootCert.crt" -->';
        //$options->merchantCertPath = '<-- 请填写您的应用公钥证书文件路径，例如：/foo/appCertPublicKey_2019051064521003.crt -->';

        //注：如果采用非证书模式，则无需赋值上面的三个证书路径，改为赋值如下的支付宝公钥字符串即可
        $options->alipayPublicKey = $config['public_key'];
        //可设置异步通知接收服务地址（可选）
        $options->notifyUrl = $notifyUrl;

        //可设置AES密钥，调用AES加解密相关接口时需要（可选）
        //$options->encryptKey = "<-- 请填写您的AES密钥，例如：aa4BtZ4tspm2wnXLb1ThQA== -->";

        return $options;
    }
}